<?php

namespace App\Models;

use App\Models\Category\Category;
use Askedio\SoftCascade\Traits\SoftCascadeTrait;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Jedrzej\Pimpable\PimpableTrait;
use Illuminate\Database\Eloquent\SoftDeletes;

class Product extends Model
{
    use HasFactory;
    use PimpableTrait;
    use SoftDeletes;
    use SoftCascadeTrait;


    /**
     * 表中的类型状态 无
     */

    /**
     * 强制转换的属性
     *
     * @var array
     */
    protected $casts = [
        'slider_image' => 'array'
    ];

    /**
     * 可搜索字段
     */
    public $searchable = [
        'mer_id',
        'label_id',
        'product_name',
        'keyword',
        'spu',
        'command_word',
        'coupon_id',
        'stock',
        'status',
        'category:top_category_id',
        'category:category_id',
    ];

    /**
     * 查询字段模式
     *
     *  nickname => '%field%' 模糊查询
     *  created_at= (ge)field
     * @var array
     */
    public $searchableModels = [
        'product_name' => '%field%',
        'keyword' => '%field%'
    ];

    /**
     * 不可批量赋值字段
     */
    public $guarded = [
        'mer_id'
    ];

    /**
     * 可排序字段
     */
    public $sortable = [
        'id',
        'sort',
    ];

    /**
     * 默认排序字段
     */
    protected $defaultSortCriteria = ['sort,desc'];


    /**
     * 联代删除的关系，用的组件 askedio/laravel-soft-cascade
     */
    protected $softCascade = [
        'productattrvalue',
        'productdescription',
        'productattrresult',
        'productcate',
        'productreply',
        'coupons',
        'label'
        ];


    /**
     * 关联的单规格属性商品详情表
     */
    public function productattrvalue(){

        return $this->hasOne(ProductAttrValue::class,'product_id','id')->where('type','noActivity');

    }

    /**
     * 关联的商品详情表
     */
    public function productdescription(){

        return $this->hasOne(ProductDescription::class,'product_id','id')->where('type','noActivity');

    }

    /**
     * 关联的多规格属性商品详情表
     */
    public function productattrresult(){

        return $this->hasMany(ProductAttrResult::class,'product_id','id');
    }

    /**
     * 商品关联的中间表数据
     */
    public function productcate()
    {
        return $this->hasMany(ProductCate::class,'product_id','id');
    }

    /**
     * 商品关联的一级分类
     */
    function topcategory(){
        return $this->hasManyThrough(
            Category::class,//最终关联的模型
            ProductCate::class,//中间模型
            'product_id',// 中间模型和本模型关联的键
            'id',// 最终关联模型的外键
            'id',// 本模型和中间模型关联的键
            'top_category_id'// 中间表和最终模型关联的一个键
        );
    }

    /**
     * 商品关联的三级分类
     */
    function category(){
        return $this->hasManyThrough(
            Category::class,//最终关联的模型
            ProductCate::class,//中间模型
             'product_id',// 中间模型和本模型关联的键
            'id',// 最终关联模型的外键
            'id',// 本模型和中间模型关联的键
            'category_id'// 中间表和最终模型关联的一个键
        );
    }


    /**
     * 关联的运费模板
     */
    function temp(){
        return $this->belongsTo(ShippingTemplates::class,'temp_id','id');
    }

    /**
     * 关联的用户标签中间表
     */
    function label(){
        return $this->hasMany(ProductUserLabelRelation::class,'product_id','id');
    }

    /**
     * 关联的优惠券中间表
     */
    function coupons(){
        return $this->hasMany(ProductCoupon::class,'product_id','id');
    }

    /**
     * 关联的评论表
     */
    function productreply(){
        return $this->hasMany(ProductReply::class,'product_id','id');
    }

}

